﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace AsTekMobile
{
    public partial class frmUrunDegisimi : Form
    {
        DataTable dt = new DataTable();
        public bool GarantiliDegisim { get; set; }
        private Stok AlinanUrun;
        private Stok VerilenUrun;
        public CariBilgi Cari { get; set; }
        public string AracKodu { get; set; }
        public int ServisID { get; set; }

        public frmUrunDegisimi()
        {
            InitializeComponent();
            this.Load += new EventHandler(frmUrunDegisimi_Load);
        }

        void frmUrunDegisimi_Load(object sender, EventArgs e)
        {
            try
            {
                if (GarantiliDegisim)
                {
                    dt.Columns.Add("Bilgi", typeof(string));
                    dt.Columns.Add("Veri", typeof(string));
                    txtVerilecekUrun.Visible = false;
                    lblToplam.Visible = false;
                }
                else
                {
                    dt.Columns.Add("Adi", typeof(string));
                    dt.Columns.Add("Fiyat(TL)", typeof(string));
                    dt.Columns.Add("Doviz", typeof(string));
                    dt.Columns.Add("Onay", typeof(bool));
                    dt.Columns.Add("Kodu", typeof(string));
                }

                grdBilgiler.DataSource = dt;
                grdBilgiler.Cols[0].Visible = false;
                grdBilgiler.Cols[1].AllowEditing = false;
                grdBilgiler.Cols[2].AllowEditing = false;
                if (!GarantiliDegisim)
                {
                    grdBilgiler.Cols[3].AllowEditing = false;
                    grdBilgiler.Cols[5].Visible = false;
                }

                grdBilgiler.Rows[0].Visible = false;
            }
            catch (Exception ex)
            {
                ErrorMgr.Opps(ex);
            }
        }

        private void VerilecekUrunBul(string serino)
        {
            try
            {
                dt.Rows.Clear();
                Stok stk = Database.ctor.Urunbul(serino);
                if (stk != null)
                {
                    if (GarantiliDegisim)
                    {
                        dt.Rows.Add("Kodu:", stk.Kodu);
                        dt.Rows.Add("Adı:", stk.Adi);
                        dt.Rows.Add("Fiyatı:", stk.Fiyat.ToString("n2"));
                        grdBilgiler.AutoSizeCols();
                        VerilenUrun = stk;
                        Doviz dv = Database.ctor.Dovizler.Where(x => x.Adi == stk.Doviz).FirstOrDefault();
                        if (dv != null)
                            VerilenUrun.Fiyat = stk.Fiyat * Cevir.Parse<decimal>(dv.Kur);
                    }
                    else
                    {
                        txtVerilecekUrun.Text = stk.Kodu + "-" + stk.Adi;
                        if (stk.Parcalar != null)
                            foreach (var item in stk.Parcalar)
                            {
                                Doviz dvz = Database.ctor.Dovizler.Where(x => x.No == item.Doviz).FirstOrDefault();
                                if (dvz != null)
                                    dt.Rows.Add(item.Adi, item.Fiyat * dvz.Kur, item.Fiyat.ToString() + " " + dvz.Adi, false, item.HizmetKodu);
                                else
                                    dt.Rows.Add(item.Adi, item.Fiyat, "TL", false, item.HizmetKodu);
                            }
                        grdBilgiler.AutoSizeCols();
                        VerilenUrun = stk;
                        Doviz dv = Database.ctor.Dovizler.Where(x => x.Adi == stk.Doviz).FirstOrDefault();
                        if (dv != null)
                            VerilenUrun.Fiyat = stk.Fiyat * Cevir.Parse<decimal>(dv.Kur);
                    }
                }
                else
                {
                    MessageBox.Show("Ürün Bulunamadı !");
                }
            }
            catch (Exception ex)
            {
                ErrorMgr.Opps(ex);
            }
        }

        private void AlinacakUrunBul(string serino)
        {
            try
            {
                Stok stk = Database.ctor.Urunbul(serino);
                if (stk != null)
                {
                    txtAlinacakUrunAdi.Text = stk.Kodu + "-" + stk.Adi;
                    AlinanUrun = stk;
                    txtVerilenSeri.Focus();
                    Doviz dv = Database.ctor.Dovizler.Where(x => x.Adi == stk.Doviz).FirstOrDefault();
                    if (dv != null)
                        AlinanUrun.Fiyat = stk.Fiyat * Cevir.Parse<decimal>(dv.Kur);
                }
                else
                {
                    MessageBox.Show("Ürün Bulunamadı !");
                }
            }
            catch (Exception ex)
            {
                ErrorMgr.Opps(ex);
            }
        }

        private void txtAlinanSeri_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (!string.IsNullOrEmpty(txtAlinanSeri.Text))
                    AlinacakUrunBul(txtAlinanSeri.Text);
            }
        }

        private void txtVerilenSeri_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (!string.IsNullOrEmpty(txtVerilenSeri.Text))
                    VerilecekUrunBul(txtVerilenSeri.Text);
            }
        }

        private void btnTamam_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult dlg = MessageBox.Show("Kaydetmek istediğinize eminmisiniz ?", "uyarı", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                if (dlg == DialogResult.Yes)
                {
                    if (GarantiliDegisim)
                    {
                        GarantiliDegisimIslemi();
                    }
                    else
                    {
                        GarantisizDegisimIslemi();
                    }
                }
                else if (dlg == DialogResult.Cancel)
                    this.Close();
            }
            catch (Exception ex)
            {
                ErrorMgr.Opps(ex);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }

        private void grdBilgiler_AfterEdit(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
        {
            if (!GarantiliDegisim)
            {
                decimal fiyat = 0;
                decimal kdvDahil = 0;
                decimal kdvHaric = 0;

                if (grdBilgiler.Rows.Count > 0)
                {
                    for (int i = 1; i < grdBilgiler.Rows.Count; i++)
                    {
                        if (Cevir.Parse<bool>(grdBilgiler[i, 4]))
                        {
                            fiyat = Cevir.Parse<decimal>(grdBilgiler[i, 2]);
                            kdvHaric += fiyat;
                            kdvDahil += fiyat * ((100m + VerilenUrun.KdvOran) / 100m);
                        }
                    }
                }
                else
                {
                    kdvHaric = VerilenUrun.Fiyat;
                    kdvDahil = VerilenUrun.Fiyat * ((100m + VerilenUrun.KdvOran) / 100m);
                }
                lblToplam.Text = "Toplam :" + kdvDahil.ToString("n2");
            }
        }

        private void GarantisizDegisimIslemi()
        {
            User usr = Database.ctor.Kullanicilar.Where(x => x.ID == Cevir.Parse<int>(Program.Session[Settings.TeknikServisID])).FirstOrDefault();
            decimal fiyat = 0;
            decimal kdvDahil = 0;
            decimal kdvHaric = 0;

            if (grdBilgiler.Rows.Count > 0)
            {
                for (int i = 1; i < grdBilgiler.Rows.Count; i++)
                {
                    if (Cevir.Parse<bool>(grdBilgiler[i, 4]))
                    {
                        fiyat = Cevir.Parse<decimal>(grdBilgiler[i, 2]);
                        kdvHaric += fiyat;
                        kdvDahil += fiyat * ((100m + VerilenUrun.KdvOran) / 100m);
                    }
                }
            }
            else
            {
                kdvHaric = VerilenUrun.Fiyat;
                kdvDahil = VerilenUrun.Fiyat * ((100m + VerilenUrun.KdvOran) / 100m);
            }



            frmBelgeNo frm = new frmBelgeNo();
            frm.EvrakCinsi = EvrakTipleri.ToptanAlisIrsaliyesi;
            frm.Cari = this.Cari;
            frm.KdvDahilTutar = kdvDahil.ToString("n2");
            frm.KdvHaricTutar = kdvHaric.ToString("n2");

            if (frm.ShowDialog() == DialogResult.OK)
            {
                Evrak[] evraklar = new Evrak[3];

                #region Alis İrsaliyesi
                Evrak evr = new Evrak();
                evr.DbNo = usr.DbNo;
                evr.ServisID = ServisID;
                evr.EvrakSeriGirildi = true;
                evr.BelgeNo = frm.EvrakBelgeNo;
                evr.CariKodu = Cari.CariKodu;
                evr.CikisDepoNo = usr.ArizaliDepoNo;
                evr.EvrakCinsi = EvrakTipleri.ToptanAlisIrsaliyesi;
                evr.FirmaNo = Cevir.Parse<int>(usr.FirmaNo);
                evr.GirisDepoNo = usr.ArizaliDepoNo;
                evr.MikroKullanici = usr.MikroKullanici;
                evr.PlasiyerKodu = usr.Plasiyer;
                evr.Seri = frm.EvrakSeri;
                evr.Sira = frm.EvrakSira;
                evr.SrmMerkezKodu = usr.SrmMerkezi;
                evr.SubeNo = Cevir.Parse<int>(usr.SubeNo);
                evr.Tarih = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
                evr.AracKodu = AracKodu;

                HareketBilgileri alinan = new HareketBilgileri();
                alinan.Barkod = "";
                alinan.BurutTutar = AlinanUrun.Fiyat;
                alinan.Fiyat = AlinanUrun.Fiyat;
                alinan.Miktar = 1;
                alinan.Satir = 0;
                alinan.KdvSira = AlinanUrun.Kdv;
                alinan.KdvOrani = AlinanUrun.KdvOran;
                alinan.KdvTutari = (AlinanUrun.Fiyat - (AlinanUrun.Fiyat / ((100m + AlinanUrun.KdvOran) / 100m)));
                alinan.SeriNolar = new string[] { txtAlinanSeri.Text };
                alinan.SipDbcNo = 0;
                alinan.SipRecNo = 0;
                alinan.StokAdi = AlinanUrun.Adi;
                alinan.StokKodu = AlinanUrun.Kodu;
                evr.Rows.Add(alinan);
                evraklar[0] = evr;
                #endregion

                #region Satış İrsaliyesi
                evr = new Evrak();
                evr.DbNo = usr.DbNo;
                evr.ServisID = ServisID;
                evr.EvrakSeriGirildi = true;
                evr.BelgeNo = frm.EvrakBelgeNo;
                evr.CariKodu = Cari.CariKodu;
                evr.CikisDepoNo = usr.ArizaliDepoNo;
                evr.EvrakCinsi = EvrakTipleri.ToptanSatisIrsaliyesi;
                evr.FirmaNo = Cevir.Parse<int>(usr.FirmaNo);
                evr.GirisDepoNo = usr.ArizaliDepoNo;
                evr.MikroKullanici = usr.MikroKullanici;
                evr.PlasiyerKodu = usr.Plasiyer;
                evr.Seri = frm.EvrakSeri;
                evr.Sira = frm.EvrakSira;
                evr.SrmMerkezKodu = usr.SrmMerkezi;
                evr.SubeNo = Cevir.Parse<int>(usr.SubeNo);
                evr.Tarih = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
                evr.AracKodu = AracKodu;

                HareketBilgileri satilan = new HareketBilgileri();
                satilan.Barkod = "";
                satilan.BurutTutar = VerilenUrun.Fiyat;
                satilan.Fiyat = VerilenUrun.Fiyat;
                satilan.Miktar = 1;
                satilan.Satir = 0;
                satilan.KdvSira = VerilenUrun.Kdv;
                satilan.KdvOrani = VerilenUrun.KdvOran;
                satilan.KdvTutari = (VerilenUrun.Fiyat - (VerilenUrun.Fiyat / ((100m + VerilenUrun.KdvOran) / 100m)));
                satilan.SeriNolar = new string[] { txtVerilenSeri.Text };
                satilan.SipDbcNo = 0;
                satilan.SipRecNo = 0;
                satilan.StokAdi = VerilenUrun.Adi;
                satilan.StokKodu = VerilenUrun.Kodu;
                evr.Rows.Add(satilan);
                evraklar[1] = evr;
                #endregion

                #region Hizmet Faturası
                if (grdBilgiler.Rows.Count > 0)
                {
                    evr = new Evrak();
                    evr.DbNo = usr.DbNo;
                    evr.ServisID = ServisID;
                    evr.EvrakSeriGirildi = true;
                    evr.BelgeNo = frm.EvrakBelgeNo;
                    evr.CariKodu = Cari.CariKodu;
                    evr.CikisDepoNo = usr.DepoNo;
                    evr.EvrakCinsi = EvrakTipleri.ToptanAlisIrsaliyesi;
                    evr.FirmaNo = Cevir.Parse<int>(usr.FirmaNo);
                    evr.GirisDepoNo = usr.DepoNo;
                    evr.MikroKullanici = usr.MikroKullanici;
                    evr.PlasiyerKodu = usr.Plasiyer;
                    evr.Seri = frm.EvrakSeri;
                    evr.Sira = frm.EvrakSira;
                    evr.SrmMerkezKodu = usr.SrmMerkezi;
                    evr.SubeNo = Cevir.Parse<int>(usr.SubeNo);
                    evr.Tarih = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
                    evr.AracKodu = AracKodu;

                    HareketBilgileri verilen;
                    int satir = 0;
                    for (int i = 1; i < grdBilgiler.Rows.Count; i++)
                    {
                        if (Cevir.Parse<bool>(grdBilgiler[i, 4]))
                        {
                            fiyat = Cevir.Parse<decimal>(grdBilgiler[i, 2]);
                            verilen = new HareketBilgileri();
                            verilen.Barkod = "";
                            verilen.BurutTutar = fiyat;
                            verilen.Fiyat = fiyat;
                            verilen.Miktar = 1;
                            verilen.Satir = satir;
                            verilen.KdvSira = VerilenUrun.Kdv;
                            verilen.KdvOrani = VerilenUrun.KdvOran;
                            verilen.KdvTutari = (fiyat - (fiyat / ((100m + VerilenUrun.KdvOran) / 100m)));
                            verilen.SeriNolar = new string[] { };
                            verilen.SipDbcNo = 0;
                            verilen.SipRecNo = 0;
                            verilen.StokAdi = grdBilgiler[i, 1].ToString();
                            verilen.StokKodu = grdBilgiler[i, 5].ToString();
                            evr.Rows.Add(verilen);
                            satir++;
                        }
                    }
                    evraklar[2] = evr;
                }
                #endregion

                bool result = Database.ctor.SaveAllEvrak(evraklar);
                if (result == false)
                {
                    MessageBox.Show("Kaydedilemedi ! tekrar deneyiniz !");
                }
                else
                {
                    DialogResult rs = MessageBox.Show("Evrak kaydedildi ! yazdırmak istermisiniz ?", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    if (rs == DialogResult.Yes)
                    {
                        frmListe liste = new frmListe();
                        liste.ServisID = ServisID;
                        liste.Show();
                    }
                    this.Close();
                }
            }
        }

        private void GarantiliDegisimIslemi()
        {
            User usr = Database.ctor.Kullanicilar.Where(x => x.ID == Cevir.Parse<int>(Program.Session[Settings.TeknikServisID])).FirstOrDefault();

            Evrak evr = new Evrak();
            evr.DbNo = usr.DbNo;
            evr.ServisID = ServisID;
            evr.EvrakSeriGirildi = false;
            evr.BelgeNo = "";
            evr.CariKodu = Cari.CariKodu;
            evr.CikisDepoNo = usr.ArizaliDepoNo;
            evr.EvrakCinsi = EvrakTipleri.ToptanAlisIrsaliyesi;
            evr.FirmaNo = Cevir.Parse<int>(usr.FirmaNo);
            evr.GirisDepoNo = usr.ArizaliDepoNo;
            evr.MikroKullanici = usr.MikroKullanici;
            evr.PlasiyerKodu = usr.Plasiyer;
            evr.Seri = usr.EvrakSeri;
            evr.Sira = 1;
            evr.SrmMerkezKodu = usr.SrmMerkezi;
            evr.SubeNo = Cevir.Parse<int>(usr.SubeNo);
            evr.Tarih = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
            evr.AracKodu = AracKodu;

            HareketBilgileri alinan = new HareketBilgileri();
            alinan.Barkod = "";
            alinan.BurutTutar = AlinanUrun.Fiyat;
            alinan.Fiyat = AlinanUrun.Fiyat;
            alinan.Miktar = 1;
            alinan.Satir = 0;
            alinan.KdvSira = AlinanUrun.Kdv;
            alinan.KdvOrani = AlinanUrun.KdvOran;
            alinan.KdvTutari = (AlinanUrun.Fiyat - (AlinanUrun.Fiyat / ((100m + AlinanUrun.KdvOran) / 100m)));
            alinan.SeriNolar = new string[] { txtAlinanSeri.Text };
            alinan.SipDbcNo = 0;
            alinan.SipRecNo = 0;
            alinan.StokAdi = AlinanUrun.Adi;
            alinan.StokKodu = AlinanUrun.Kodu;

            evr.Rows.Add(alinan);

            bool result = Database.ctor.SaveEvrak(evr);
            if (result == false)
            {
                MessageBox.Show("Kaydedilemedi ! tekrar deneyiniz !");
                return;
            }
            evr.Rows.Clear();
            evr.EvrakCinsi = EvrakTipleri.ToptanSatisIrsaliyesi;

            HareketBilgileri verilen = new HareketBilgileri();
            verilen.Barkod = "";
            verilen.BurutTutar = VerilenUrun.Fiyat;
            verilen.Fiyat = VerilenUrun.Fiyat;
            verilen.Miktar = 1;
            verilen.Satir = 0;
            verilen.KdvSira = VerilenUrun.Kdv;
            verilen.KdvOrani = VerilenUrun.KdvOran;
            verilen.KdvTutari = (VerilenUrun.Fiyat - (VerilenUrun.Fiyat / ((100m + VerilenUrun.KdvOran) / 100m)));
            verilen.SeriNolar = new string[] { txtVerilenSeri.Text };
            verilen.SipDbcNo = 0;
            verilen.SipRecNo = 0;
            verilen.StokAdi = VerilenUrun.Adi;
            verilen.StokKodu = VerilenUrun.Kodu;
            evr.Rows.Add(verilen);

            result = Database.ctor.SaveEvrak(evr);
            if (result == false)
            {
                MessageBox.Show("Kaydedilemedi ! tekrar deneyiniz !");
            }
            else
            {
                MessageBox.Show("Kaydedildi !");
                this.Close();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (Sip.Visible)
            {
                Sip.Visible = false;
            }
            else
            {
                Sip.Visible = true;
            }
        }

        bool VerilecekArandi = false;
        private void btnAlAra_Click(object sender, EventArgs e)
        {
            VerilecekArandi = false;
            UrunAra(txtAlinanSeri.Text);
        }

        private void UrunAra(string filtre)
        {
            try
            {
                grdListe.AllowEditing = false;
                grdListe.DataSource = Database.ctor.Stoklar.Where(x => x.Kodu.Like(filtre) || x.Adi.Like(filtre)).ToList();
                grdListe.Cols[0].Visible = false;
                grdListe.Cols[1].Visible = false;
                grdListe.Cols[2].Caption = "Stok Kodu";
                grdListe.Cols[3].Caption = "Stok Adı";
                grdListe.Cols[4].Caption = "Fiyat";
                grdListe.Cols[5].Caption = "Döviz Cinsi";
                grdListe.Cols[6].Visible = false;
                grdListe.Cols[7].Visible = false;
                grdListe.Cols[2].AllowEditing = false;
                grdListe.Cols[3].AllowEditing = false;
                grdListe.Cols[4].AllowEditing = false;
                grdListe.Cols[5].AllowEditing = false;

                tabControl1.SelectedIndex = 1;
            }
            catch (Exception ex)
            {
                ErrorMgr.Opps(ex);
            }
        }

        private void btnVerAra_Click(object sender, EventArgs e)
        {
            VerilecekArandi = true;
            UrunAra(txtVerilenSeri.Text);
        }

        private void grdListe_DoubleClick(object sender, EventArgs e)
        {
            if (VerilecekArandi)
            {
                dt.Rows.Clear();
                Stok stk = ((List<Stok>)grdListe.DataSource)[grdListe.Row - 1];
                if (stk != null)
                {
                    if (GarantiliDegisim)
                    {
                        dt.Rows.Add("Kodu:", stk.Kodu);
                        dt.Rows.Add("Adı:", stk.Adi);
                        dt.Rows.Add("Fiyatı:", stk.Fiyat.ToString("n2"));
                        grdBilgiler.AutoSizeCols();
                        VerilenUrun = stk;
                    }
                    else
                    {
                        stk = Database.ctor.Urunbul(stk.Kodu);
                        txtVerilecekUrun.Text = stk.Kodu + "-" + stk.Adi;
                        if (stk.Parcalar != null)
                            foreach (var item in stk.Parcalar)
                            {
                                dt.Rows.Add(item.Adi, item.Fiyat, Database.ctor.Dovizler.Where(x => x.No == item.Doviz).Select(x => x.Adi).FirstOrDefault(), false, item.HizmetKodu);
                            }
                        grdBilgiler.AutoSizeCols();
                        VerilenUrun = stk;
                    }
                }
            }
            else
            {
                if (grdListe.Row > -1)
                {
                    Stok stk = ((List<Stok>)grdListe.DataSource)[grdListe.Row - 1];
                    if (stk != null)
                    {
                        txtAlinacakUrunAdi.Text = stk.Kodu + "-" + stk.Adi;
                        AlinanUrun = stk;
                        txtVerilenSeri.Focus();
                    }
                }
            }

            tabControl1.SelectedIndex = 0;
        }

    }
}